from flask import *
from bluePrints.forms import LoginForm, RegisterForm
from werkzeug.datastructures import MultiDict
from exts import *
from models import *
from flask_socketio import SocketIO, emit, send

# 初始化 SocketIO
socketio = SocketIO(async_mode='eventlet', cors_allowed_origins="*")  # 允许所有域名访问

# 存储在线用户
online_users = set()

# WebSocket 事件处理
@socketio.on('message')
def handle_message(data):
    """
    处理客户端发送的消息，并广播给所有客户端
    """
    # print(f"收到消息: {data}")
    # 广播消息，附带消息类型
    send({
        'type': 'user',  # 消息类型：用户消息
        'user': data.get('user', '匿名用户'),
        'text': data['text'],
        'online_users': list(online_users)  # 附带当前在线用户列表
    }, broadcast=True)

@socketio.on('user_info')
def handle_user_info(user_info):
    """
    处理前端发送的用户信息
    """
    if user_info and 'username' in user_info:
        username = user_info['username']
        online_users.add(username)
        session['username'] = username  # 将用户名存储到 session 中
        # print(f"用户 {username} 已连接，当前在线用户数: {len(online_users)}")
        # 广播系统消息
        send({
            'type': 'system',  # 消息类型：系统消息
            'user': '系统',
            'text': f'用户 {username} 加入了聊天室，当前在线用户数: {len(online_users)}',
            'online_users': list(online_users)  # 附带当前在线用户列表
        }, broadcast=True)

@socketio.on('disconnect')
def handle_disconnect():
    """
    处理用户断开连接
    """
    username = session.get('username')
    if username:
        online_users.discard(username)
        # print(f"用户 {username} 已断开连接")
        # 广播系统消息
        send({
            'type': 'system',  # 消息类型：系统消息
            'user': '系统',
            'text': f'用户 {username} 离开了聊天室',
            'online_users': list(online_users)  # 附带当前在线用户列表
        }, broadcast=True)

@socketio.on('getOnlineUsers')
def handle_get_online_users():
    emit('onlineUsers', list(online_users))